package com.yuanjin.util;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Environment;
import android.util.Log;

public class FileUtils {
	// 在SD卡上创建一个文件夹
	public static void createSDCardDir() {
		if (Environment.MEDIA_MOUNTED.equals(Environment
				.getExternalStorageState())) {
			// 创建一个文件夹对象，赋值为外部存储器的目录
			File sdcardDir = Environment.getExternalStorageDirectory();
			// 得到一个路径，内容是sdcard的文件夹路径和名字
			String path = sdcardDir.getPath() + "/cardImages";
			File path1 = new File(path);
			if (!path1.exists()) {
				// 若不存在，创建目录，可以在应用启动的时候创建
				path1.mkdirs();
				Log.e("test", "paht ok,path:" + path);
			}
		} else {
			Log.e("test", "paht ok,path:" + "false");
			return;

		}

	}

	/*************************** 上传图片操作 *********************************/

	/* 上传文件至Server，uploadUrl：接收文件的处理页面 */
	/**
	 * @param uploadUrl
	 *            上传路径
	 * @param srcPath
	 *            文件绝对路径
	 */
	public static void uploadFile(String uploadUrl, String srcPath) {
		String end = "\r\n";
		String twoHyphens = "--";
		String boundary = UUID.randomUUID().toString();// 边界标识 随机生成
		try {
			URL url = new URL(uploadUrl);
			// URL url2=new
			HttpURLConnection httpURLConnection = (HttpURLConnection) url
					.openConnection();
			// 设置每次的传输流大小，可以有效防止手机因为内存不足崩溃
			// 此方法用于在预先不知道内容长度时启用没有进行内部缓存的HTTP请求正文的流
			httpURLConnection.setChunkedStreamingMode(128 * 1024);// 128K
			httpURLConnection.setDoInput(true);// 允许输入流
			httpURLConnection.setDoOutput(true);// 允许输出流
			httpURLConnection.setUseCaches(false);// 不允许使用缓存
			httpURLConnection.setRequestMethod("POST");// 使用post方法，必须大写
			/*------------以下三行设置http请求头信息-------------*/
			httpURLConnection.setRequestProperty("Charset", "UTF-8");// 设置文件字符集
			httpURLConnection.setRequestProperty("Connection", "Keep-Alive");// 设置长连接
			// String CONTENT_TYPE = "multipart/form-data"; // 内容类型
			// 在模拟web页面向服务器端上传文件时，每个文件的开头需要有一个分界符，
			// 分界符需要在http请求头中指定，boundry是任意一个字符串，一般为******
			httpURLConnection.setRequestProperty("Content-Type",
					"multipart/form-data;boundary=" + boundary);

			DataOutputStream dos = new DataOutputStream(
					httpURLConnection.getOutputStream());
			dos.writeBytes(twoHyphens + boundary + end);// "--boundry\r\n"
			// 上传文件相关信息，这些信息包括请求参数名，上传文件名，文件类型，但并不限于此
			dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\""
					+ srcPath.substring(srcPath.lastIndexOf("/") + 1)
					+ "\""
					+ end);
			dos.writeBytes(end);
			// 获得文件的输入流，通过流传输文件。
			FileInputStream fis = new FileInputStream(srcPath);
			// ByteArrayInputStream bais=new ByteArrayInputStream(buf);
			// FileInputStream fis2=new
			byte[] buffer = new byte[8192];
			int count = 0;
			// 从文件读取数据到缓冲区
			while ((count = fis.read(buffer)) != -1) {
				// 将资料写入DateOutputStream中
				dos.write(buffer, 0, count);
			}

			dos.writeBytes(end);
			dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
			fis.close();
			dos.flush();// flush实际上就是将所有的写入的流，一次性输出到文件中
			// 在调用下边的getInputStream()函数时才将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端
			InputStream is = httpURLConnection.getInputStream();
			// 至此，http请求已经被发送到服务器
			InputStreamReader isr = new InputStreamReader(is, "utf-8");// 该类将字节流转化为字符流
			BufferedReader br = new BufferedReader(isr);
			// 获取返回结果，在getInputStream()函数调用的时候，就会把准备好的http请求正式发送到服务器了，
			// 然后返回一个输入流，用于读取服务器对于此次http请求的返回信息
			String result = br.readLine();
			// 输出返回的信息
			Log.e("http-return", "--> " + result);
			dos.close();
			is.close();
			httpURLConnection.disconnect();

		} catch (MalformedURLException e) {
			// TODO Auto-generated catch blockF
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static Boolean uploadBitmapFile(String uploadUrl, String srcPath,
			Bitmap bitmap) {
		String end = "\r\n";
		String twoHyphens = "--";
		String boundary = UUID.randomUUID().toString();// 边界标识 随机生成
		try {
			URL url = new URL(uploadUrl);
			// URL url2=new
			HttpURLConnection httpURLConnection = (HttpURLConnection) url
					.openConnection();
			// 设置每次的传输流大小，可以有效防止手机因为内存不足崩溃
			// 此方法用于在预先不知道内容长度时启用没有进行内部缓存的HTTP请求正文的流
			httpURLConnection.setChunkedStreamingMode(128 * 1024);// 128K
			httpURLConnection.setDoInput(true);// 允许输入流
			httpURLConnection.setDoOutput(true);// 允许输出流
			httpURLConnection.setUseCaches(false);// 不允许使用缓存
			httpURLConnection.setRequestMethod("POST");// 使用post方法，必须大写
			/*------------以下三行设置http请求头信息-------------*/
			httpURLConnection.setRequestProperty("Charset", "UTF-8");// 设置文件字符集
			httpURLConnection.setRequestProperty("Connection", "Keep-Alive");// 设置长连接
			// String CONTENT_TYPE = "multipart/form-data"; // 内容类型
			// 在模拟web页面向服务器端上传文件时，每个文件的开头需要有一个分界符，
			// 分界符需要在http请求头中指定，boundry是任意一个字符串，一般为******
			httpURLConnection.setRequestProperty("Content-Type",
					"multipart/form-data;boundary=" + boundary);

			DataOutputStream dos = new DataOutputStream(
					httpURLConnection.getOutputStream());
			dos.writeBytes(twoHyphens + boundary + end);// "--boundry\r\n"
			// 上传文件相关信息，这些信息包括请求参数名，上传文件名，文件类型，但并不限于此
			dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\""
					+ srcPath.substring(srcPath.lastIndexOf("/") + 1)
					+ "\""
					+ end);
			dos.writeBytes(end);

			// 获得文件的输入流，通过流传输文件。
			// FileInputStream fis = new FileInputStream(srcPath);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			bitmap.compress(Bitmap.CompressFormat.JPEG, 85, baos);
			byte[] bytes = baos.toByteArray();
			dos.write(bytes);
			// FileInputStream fis2=new
			// byte[] buffer = new byte[8192];
			// int count = 0;
			// // 从文件读取数据到缓冲区
			// while ((count = fis.read(buffer)) != -1) {
			// // 将资料写入DateOutputStream中
			// dos.write(buffer, 0, count);
			// }

			dos.writeBytes(end);
			dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
			// fis.close();
			baos.flush();
			baos.close();
			dos.flush();// flush实际上就是将所有的写入的流，一次性输出到文件中
			// 在调用下边的getInputStream()函数时才将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端
			InputStream is = httpURLConnection.getInputStream();
			// 至此，http请求已经被发送到服务器
			InputStreamReader isr = new InputStreamReader(is, "utf-8");// 该类将字节流转化为字符流
			BufferedReader br = new BufferedReader(isr);
			// 获取返回结果，在getInputStream()函数调用的时候，就会把准备好的http请求正式发送到服务器了，
			// 然后返回一个输入流，用于读取服务器对于此次http请求的返回信息
			String result = br.readLine();
			// 输出返回的信息
			Log.e("图片上传的http-return", "--> " + result);
			dos.close();
			is.close();
			httpURLConnection.disconnect();

			if (httpURLConnection.getResponseCode() == 200) {
				// Log.e("test",
				// "--------------responsecode--->"+httpURLConnection.getResponseCode());
				// Log.e("test",
				// "--------------getResponseMessage--->"+httpURLConnection.getResponseMessage());
				return true;
			} else {
				return false;
			}

		} catch (MalformedURLException e) {
			// TODO Auto-generated catch blockF
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * @param imageSrcPath
	 *            图片的绝对路径或者"/xx/.../xxx/imagename.jpg"形式的路径
	 * @return 图片的名称 eg： imagename.jpg
	 */
	public static String getImageName(String imageSrcPath) {
		String imageName = imageSrcPath
				.substring(imageSrcPath.lastIndexOf("/") + 1);
		return imageName;

	}
}
